#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

using namespace std;

// void handler(int signo)
// {
//     cout << "get a sig: " << signo << endl;

//     while (true)
//     {
//         // 等待任意子进程 不关心返回值 阻塞等待
//         pid_t rid = ::waitpid(-1, nullptr, WNOHANG);
//         if (rid > 0)
//         {
//             cout << "子进程退出了, 回收成功, child id:" << rid << endl;
//         }
//         else if (rid < 0)
//         {
//             cout << "暂时回收成功" << endl;
//             break;
//         }
//     }
// }

// void handler(int signo)
// {
//     cout << "get a sig: " << signo << endl;

//     while (true)
//     {
//         // 等待任意子进程 不关心返回值 阻塞等待
//         pid_t rid = ::waitpid(-1, nullptr, WNOHANG);
//         if (rid > 0)
//         {
//             cout << "子进程退出了, 回收成功, child id:" << rid << endl;
//         }
//         else if (rid == 0)
//         {
//             cout << "退出的子进程已经全部回收了" << endl;
//             break;
//         }
//         else
//         {
//             cout << "wait error" << endl;
//             break;
//         }
//     }
// }

int main()
{
    // 捕捉信号
    //signal(SIGCHLD, handler);
    signal(SIGCHLD, SIG_IGN);

    for (int i = 0; i < 3; ++i)
    {
        if (fork() == 0)
        {
            sleep(2);
            // 子进程
            cout << "子进程退出" << endl;
            exit(0);
        }
    }

    if (fork() == 0)
    {
        while (true)
        {
            cout << "我不退出, pid为: " << getpid() << endl;
            sleep(1);
        }
    }

    while (true)
    {
        cout << "我是父进程, pid 为：" << getpid() << endl;
        sleep(1);
    }
    return 0;
}
